#include<stdio.h>

double fib(int n);

int main(void) {
    int n;
    printf("请输入一个整数：");
    scanf("%d", &n);
    printf("fib(%d) = %.0lf\n", n, fib(n));
    return 0;
}

//double fib(int k) {
//    static int count;
//    count++;
//    printf("第%d次调用，计算fib(%d)\n", count, k);
//    if (k == 1 || k == 2 || k <= 0)
//        return 1;
//    else
//        return fib(k - 1) + fib(k - 2);
//}

double fib(int k) {
    static int count = 0;
    static double memo[100] = {0}; // 假设 k 的最大值为 100

    count++;
    printf("第%d次调用，计算fib(%d)\n", count, k);

    // 添加异常处理
    if (k <= 0) {
        printf("输入必须为正整数\n");
        return -1;
    }

    // 使用数组来存储已经计算过的斐波那契数
    if (k == 1 || k == 2) {
        return 1;
    }

    if (memo[k] != 0) {
        return memo[k];
    }

    memo[k] = fib(k - 1) + fib(k - 2);
    return memo[k];
}
